const urlLib = require("url");
const path   = require('path');
const config = require('../crawler/config/config');
const os     = require('os');
const md5    = require('./MD5');

class utils{

    /**
     * 解析主机域名
     * @param urlStr 原始url
     * @returns {string}
     */
    static parserUrlDomain(urlStr){
        return urlLib.parse(urlStr).hostname;
    }

    /**
     * 匹配字符串中的数字
     */
    static matchNumber(str){
        return str.replace(/[^0-9]/ig,"")
    }

    /**
     * 构造解析器目录
     */
    static loadParserPath(type){
        return path.resolve(__dirname,config.PARSER.BASE_PATH,type)
    }

    /**
     * 清除特殊字符
     */
    static special(str){
        // 去掉转义字符
        str = str.replace(/[\'\"\\\/\b\f\n\r\t]/g, '');
        // 去掉特殊字符
        str = str.replace(/[\@\#\$\%\^\&\*\{\}\?\[\]]/g,'');
        return str;
    }

    /**
     * 针对xx K次 转换为实际值
     * @param vstr
     */
    static unitTrans(vstr){
        if(vstr.indexOf('K') === -1){
            return vstr
        }
        vstr = utils.special(vstr);
        vstr = vstr.replace('K','');
        return Math.floor(vstr * 1000);
    }

    /**
     * 时间格式转换为秒
     * @param time 时间字符串 00:00:00
     */
    static timeTransSecond(time){
        let s = 0;

        let arrayTime = time.split(':');
        if(arrayTime.length === 1){
            return Number(arrayTime[0])
        }else if(arrayTime.length === 2){
            let min = time.split(':')[0];
            let sec = time.split(':')[1];
            return Number(min*60) + Number(sec);
        }else if(arrayTime.length === 3){
            let hour = time.split(':')[0];
            let min = time.split(':')[1];
            let sec = time.split(':')[2];
            return Number(hour*3600) + Number(min*60) + Number(sec);
        }
        return s;
    }

    /**
     * 判断字符串是否为空
     */
    static isNotEmpty(object){
        return object !== null && object !== undefined && object !== '';
    }

    /**
     * 获取操作系统
     */
    static systemPlatform(){
        const platform = os.platform()
        switch (platform) {
            case 'darwin':
                console.log("MacOSX")
                break;
            case 'linux':
                console.log('Linux')
                break;
            case 'win32':
                console.log('Windows')
                break;
            default:
                console.log("无法确定操作系统!")

        }
    }

    /**
     * 判断是否为Linux操作系统
     * @returns {boolean}
     */
    static isLinux(){
        let platform = os.platform();
        return platform === 'linux';
    }

    static sleep(second){
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve();
            }, second);
        })
    }

    /**
     * 检查网络地址是否合法
     */
    static validUrlFormat(url){
        let RegUrl = new RegExp();
        RegUrl.compile('((http|ftp|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?');
        return RegUrl.test(url);
    }

    /**
     * 字符串模板替换
     * @param string  原始字符
     * @param obj     值对象
     */
    static async parserString(string,obj){
        return await string.replace(/\{\{([^\}]+)\}\}/g,async ($1,$2) =>{
            return obj[$2] ? obj[$2] :$1;
        });
    }

    /**
     * 获取当前时间戳下的文本md5值
     * @param text 文本
     */
    static async currentTimeMd5Seq(text){
        let date = new Date();
        return await md5.encodeMD5(`${date}:${text}`)
    }
}
module.exports = utils;
